package com.chen.sa.auth.config;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.sso.config.SaSsoServerConfig;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSONObject;
import com.chen.base.utils.DutyLinkUtil;
import com.chen.common.satoken.SaTokenAutoConfig;
import com.chen.common.satoken.params.LoginParam;
import com.chen.common.satoken.provider.AuthAbsProvider;
import com.chen.root.base.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.Map;

/**
 * @author: ChenJinLong
 * @DATE: 2024/12/30
 **/
@Slf4j
@Configuration
public class SsoAuthServerConfig {

    /**
     * 配置SSO相关参数
     */
    @Resource
    public void configSso(SaSsoServerConfig serverConfig) {
        // 配置：未登录时返回的View
        serverConfig.notLoginView = () -> R.failed(null, "未登录! ");

        // 在doLoginHandle函数里如果要获取name, pwd以外的参数，可通过SaHolder.getRequest().getParam("xxx")来获取
        serverConfig.doLoginHandle = (name, pwd) -> {
            Map<String, String> paramMap = SaHolder.getRequest().getParamMap();

            LoginParam loginParam = new LoginParam();
            loginParam.setAuthType(paramMap.get("authType"));
            loginParam.setAuthParamMap(JSONObject.parseObject(paramMap.get("authParamMap")));

            Object userId = DutyLinkUtil.run(AuthAbsProvider.class, loginParam);
            // 会话登录：参数填写要登录的账号id，建议的数据类型：long | int | String
            if (userId != null){
                StpUtil.login(userId);
                return R.ok(StpUtil.getTokenValue(), "登录成功");
            }

            return R.failed(null, "登录失败！参数不合法...");
        };

        // 配置 Http 请求处理器 （在模式三的单点注销功能下用到，如不需要可以注释掉）
        serverConfig.sendHttp = SaTokenAutoConfig.sendHttpFunction();
        serverConfig.isHttp = true;
    }
}
